package thread.modoel;

import java.util.PriorityQueue;

/** @Package javaSE.thread.modoel @Author shimmer @Date 2020/5/14 17:57 @TODO */

public class Test {
  private int queueSize = 10;
  private PriorityQueue<Integer> queue = new PriorityQueue<>(queueSize);

  public static void main(String[] args) {
    Test test = new Test();
    Producer producer = test.new Producer();
    Consumer consumer = test.new Consumer();

    producer.start();
    consumer.start();
  }

  //消费者
  class Consumer extends Thread {

    @Override
    public void run() {
      consume();
    }

    private void consume() {
      while (true) {
        synchronized (queue) {
          while (queue.size() == 0) {
            try {
              System.out.println("队列空，等待数据");
              queue.wait();
            } catch (InterruptedException e) {
              e.printStackTrace();
              queue.notify();
            }
          }
          queue.poll(); // 每次移走队首元素
          queue.notify();
          System.out.println("从队列取走一个元素，队列剩余" + queue.size() + "个元素");
        }
      }
    }
  }

  //生产者
  class Producer extends Thread {

    @Override
    public void run() {
      produce();
    }

    private void produce() {
      while (true) {
        synchronized (queue) {
          while (queue.size() == queueSize) {
            try {
              System.out.println("队列满，等待有空余空间");
              queue.wait();
            } catch (InterruptedException e) {
              e.printStackTrace();
              queue.notify();
            }
          }
          queue.offer(1); // 每次插入一个元素
          queue.notify();
          System.out.println("向队列取中插入一个元素，队列剩余空间：" + (queueSize - queue.size()));
        }
      }
    }
  }
}
